완주하지 못한 선수

📔 문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

📓 제약 조건

마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.

📓 입출력의 예

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

❗ 1번째

먼저 참가자 배열을 반복문돌려서 오브젝트의 키값에 참가자를 넣고 그 이름으로 참여한 수를 오브젝트안에 넣어준다
그다음 완주자 이름 배열을 반복문 돌려서 오브젝트 값에 빼준다.
다음 오브젝트의 in연산자를 활용하여 밖으로 빼내어 주면될거같다.

✅ 실행 코드

function solution(participant, completion) {
  const obj = {}

  for (p of participant) {
    if (obj[p] > 1) {
      obj[p]++
    } else {
      obj[p] = 1
    }
  }

  for (c of completion) {
    obj[c]--
  }

  for (const 탈락자 in obj) {
    return 탈락자
  }
}


❗ 2번째

문제는 2가지가있었다 첫번째로는 오브젝트에 완주자의 값을 빼도 사라지는게 아니라 0이 되는걸 생각 못했다 그래서 간단하게 비어있지않고 있을때만 리턴해주게 조건문을 추가했고 if(obj[p])값도 >1로 이상하게 표기 되어있었다 수정해주니 정상적으로 돌아간다.

✅ 실행 코드

function solution(participant, completion) {
  const obj = {}

  for (p of participant) {
    if (obj[p]) {
      obj[p]++
    } else {
      obj[p] = 1
    }
  }

  for (c of completion) {
    obj[c]--
  }

  for (const 탈락자 in obj) {
    if(obj[탈락자]){
        return 탈락자
    }
  }
}

📚 문제 느낀점

정석적인 해시문제인거같다 자바스크립트의 객체를 활용하는 문제이니만큼 자바스크립트의 객체 메소드를 조금 숙지해두는게 좋을거같다.


© 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/42576?language=javascript